#include <iostream>
#include <signal.h>
#include <unistd.h>

// 获取信号集
void PrintfPending(sigset_t &pending)
{
    std::cout << "[pid: " << getpid() << "]sigpending List: ";
    for (int signo = 31; signo > 0; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void handler(int signo)
{
    std::cout << "我获取到了: " << signo << "号信号" << std::endl;
    //penging表中对应信号的的变化发生在递达之前
    sigset_t pending;

    // 2.1、获取pending信号集
    sigemptyset(&pending);
    sigpending(&pending);

    // 2.2、打印pending信号集
    std::cout << "####################################" << std::endl;
    PrintfPending(pending);
    std::cout << "####################################" << std::endl;

}

int main()
{
    // 自定义捕捉
    signal(2, handler);

    // 1.1、屏蔽信号: 用户层面
    sigset_t block;
    sigset_t oldblock;

    sigemptyset(&block);
    sigemptyset(&oldblock);

    sigaddset(&block, 2);

    // 屏蔽所有信号
    //  for(int i = 1; i <= 31; ++i)
    //  {
    //      sigaddset(&block, i);
    //  }

    // 1.2、屏蔽信号: 内核层面
    sigprocmask(SIG_BLOCK, &block, &oldblock);

    // 2、获取pending
    int cnt = 10;
    while (true)
    {

        sigset_t pending;

        // 2.1、获取pending信号集
        sigemptyset(&pending);
        sigpending(&pending);

        // 2.2、打印pending信号集
        PrintfPending(pending);

        cnt--;
        if (cnt == 0)
        {
            std::cout << "解除了对2号信号的屏蔽" << std::endl;
            // 解除屏蔽
            sigprocmask(SIG_SETMASK, &oldblock, nullptr);
        }

        sleep(1);
    }

    return 0;
}